www.gusucode.com > 基于Visual C++高级界面特效制作百例源码程序 > 基于Visual C++高级界面特效制作百例源码程序/code/char22/date_time_picker/BaseDataPk.cpp

    // BaseDataPk.cpp : implementation file
//

#include "stdafx.h"
#include "BaseDataPk.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CBaseDataPk

CBaseDataPk::CBaseDataPk()
{
	 m_curData = COleDateTime::GetCurrentTime();
	 m_lowData.SetStatus(COleDateTime::null);
	 m_highData.SetStatus(COleDateTime::null);
     m_pDataBuddy = NULL;

}
 void CBaseDataPk::SetRange(COleDateTime* dt1,COleDateTime* dt2,BOOL nullvalue,BOOL updatecurvalue)
{
  if (dt1->GetStatus() != COleDateTime::null)
	  m_lowData = *dt1;
  m_highData = *dt2;
	if (nullvalue)
	m_curData.SetStatus(COleDateTime::null);
  else 
	{
	  if (updatecurvalue)
	  m_curData = *dt1;
	}
  if (!nullvalue)
  if (!IsNullDate())
  if (m_curData < m_lowData)
	  m_curData = m_lowData;
  ShowDataControl();
  if (m_pDataBuddy)
	  m_pDataBuddy->SetRange(m_curData.GetStatus() != COleDateTime::null ? &m_curData : &m_lowData ,dt2,nullvalue,updatecurvalue);

 }
 void CBaseDataPk::SetRange(int dayback,int dayafter,BOOL nullvalue,BOOL updatecurvalue)
{
		COleDateTime t1 = COleDateTime::GetCurrentTime();
		COleDateTime t2 = t1;
      	COleDateTimeSpan s1(-dayback,0,0,0);
     	COleDateTimeSpan s2(dayafter,0,0,0);
   t1 += s1;
   t2 += s2;
 SetRange(&t1,&t2,nullvalue,updatecurvalue);
}

 
CBaseDataPk::~CBaseDataPk()
{

}
void CBaseDataPk::ShowDataControl()
{
 if (m_pk.m_hWnd == NULL)
	 return ;
 	  SYSTEMTIME s[3];
	  memset(s,0,sizeof(s));
	 DWORD d =   DateTime_GetSystemtime(m_pk.m_hWnd, &s[2]);
BOOL 	 b = DateTime_SetSystemtime(m_pk.m_hWnd, GDT_NONE,&s[2]);
	 
	 if (m_curData.GetStatus() == COleDateTime::null)
		 d = GDT_NONE;
	 else
	{
 	 s[2].wYear = m_curData.GetYear();
	 s[2].wMonth = m_curData.GetMonth();
	 s[2].wDay  = m_curData.GetDay();
	 d = GDT_VALID;
	}
//	  DateTime_SetRange(m_pk.m_hWnd,GDTR_MIN,&s[2]);
//	  DateTime_SetRange(m_pk.m_hWnd,GDTR_MAX,&s[1]);
//  	 DateTime_SetSystemtime(m_pk.m_hWnd,d,&s[2]);

	  
DWORD range = 0;
  if (m_lowData.GetStatus() != COleDateTime::null)
	{
	 s[0].wYear = m_lowData.GetYear();
	 s[0].wMonth = m_lowData.GetMonth();
	 s[0].wDay  = m_lowData.GetDay();
	 range |= GDTR_MIN;
	}
	 if (m_highData.GetStatus() != COleDateTime::null)
	{
	 s[1].wYear = m_highData.GetYear();
	 s[1].wMonth = m_highData.GetMonth();
	 s[1].wDay  = m_highData.GetDay();
	 range |= GDTR_MAX;
	}
	 if (range)
     b = DateTime_SetRange(m_pk.m_hWnd,range,s);
	 b = DateTime_SetSystemtime(m_pk.m_hWnd,d,&s[2]);
  TRACE1("show data control %s\n",(const char*)m_curData.Format("%d/%m/%Y"));


} 

 BOOL  CBaseDataPk::SetData(UINT idc,CWnd* parent,BOOL empty,BOOL updown)
{
	  	if (!SubclassDlgItem(idc,parent))
		return FALSE;
	static int giafatto = 0;
	if (!giafatto)
	{
		INITCOMMONCONTROLSEX icex;
		icex.dwSize = sizeof(INITCOMMONCONTROLSEX);
		icex.dwICC = ICC_DATE_CLASSES;
		::InitCommonControlsEx(&icex);
		giafatto++;
	}
CRect r;
  GetClientRect(r);
DWORD dwstyle = WS_CHILD|WS_VISIBLE;
if (empty)
dwstyle |= DTS_SHOWNONE;
if (updown)
dwstyle |= DTS_UPDOWN;

 m_pk.Create(DATETIMEPICK_CLASS,"",dwstyle,r,this,0);
 if (m_pk.m_hWnd == NULL)
	 return FALSE;
ShowDataControl(); 
if (m_pDataBuddy)
m_pDataBuddy->SetRange(&m_curData,&m_highData,m_curData == COleDateTime::null);
return TRUE;
 
}
BOOL CBaseDataPk::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult) 
{
	// TODO: Add your specialized code here and/or call the base class
		NMHDR* pnmh = (LPNMHDR) lParam;
if (DTN_DATETIMECHANGE == pnmh->code)
{
		LPNMDATETIMECHANGE dtmh = (LPNMDATETIMECHANGE) pnmh;
   if (dtmh->dwFlags == GDT_VALID)
	m_curData.SetDate((int)dtmh->st.wYear,(int)dtmh->st.wMonth,(int)dtmh->st.wDay);
	else
	 m_curData.SetStatus(COleDateTime::null);
 		OnDateChanged(dtmh->dwFlags == GDT_VALID );
 if (m_pDataBuddy)
	{ 
	  COleDateTime* p = m_pDataBuddy->GetCurDate();
	  if (dtmh->dwFlags == GDT_VALID)
		  if (p->GetStatus() == COleDateTime::null)
          *p = m_curData;
	  m_pDataBuddy->SetRange(&m_curData,&m_highData,dtmh->dwFlags != GDT_VALID,FALSE); //p->GetStatus() == COleDateTime::null);
	}
  
}
else
 	TRACE1("NOTIFY CODE %d\n", pnmh->code);
	*pResult = GetParent()->SendMessage(WM_NOTIFY, wParam, lParam);

	 	return TRUE;
}
void CBaseDataPk::OnDateChanged(BOOL valid) 
{
//	SYSTEMTIME s;
 // DateTime_GetSystemtime(m_pk.m_hWnd,&s);
 if (valid)
  TRACE1("ON DATA CHANGED %s\n",(const char*)m_curData.Format("%d/%m/%Y"));
 else
	 TRACE0("NULL DATA\n");
}

BEGIN_MESSAGE_MAP(CBaseDataPk, CStatic)
	//{{AFX_MSG_MAP(CBaseDataPk)
	ON_WM_DESTROY()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CBaseDataPk message handlers


void CBaseDataPk::OnDestroy() 
{
	CStatic::OnDestroy();
	
	// TODO: Add your message handler code here
  if (!IsNullDate())
	  return;
 if (!m_pDataBuddy)
return;
 if (!m_pDataBuddy->IsNullDate())
  m_curData = *(m_pDataBuddy->GetCurDate());
	
}